package javaInterview;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 * 使用线程池实现两个线程交替打印 1-100 的奇数和偶数
 * @author Cyxan
 * @version 1.0
 */
public class OddEvenThreadPool {
    // 共享锁对象，用于线程间同步
    private static final Object lock = new Object();
    // 当前要打印的数字（volatile 保证可见性）
    private static volatile int number = 1;
    // 最大打印到 100
    private static final int MAX = 100;

    public static void main(String[] args) {
        // 创建一个固定 2 个线程的线程池
        ExecutorService threadPool = Executors.newFixedThreadPool(2);

        // 提交奇数打印任务到线程池
        threadPool.submit(() -> {
            while (number <= MAX) {
                synchronized (lock) {
                    // 如果当前是偶数，奇数线程就等待
                    if (number % 2 == 0) {
                        try {
                            lock.wait();
                        } catch (InterruptedException e) {
                            Thread.currentThread().interrupt();
                            return;
                        }
                    } else {
                        // 当前是奇数，打印它
                        System.out.println(Thread.currentThread().getName() + " 打印奇数: " + number);
                        number++; // 数字加1
                        lock.notify(); // 唤醒偶数线程
                    }
                }
            }
        });

        // 提交偶数打印任务到线程池
        threadPool.submit(() -> {
            while (number <= MAX) {
                synchronized (lock) {
                    // 如果当前是奇数，偶数线程就等待
                    if (number % 2 != 0) {
                        try {
                            lock.wait();
                        } catch (InterruptedException e) {
                            Thread.currentThread().interrupt();
                            return;
                        }
                    } else {
                        // 当前是偶数，打印它
                        System.out.println(Thread.currentThread().getName() + " 打印偶数: " + number);
                        number++; // 数字加1
                        lock.notify(); // 唤醒奇数线程
                    }
                }
            }
        });

        // 关闭线程池，不再接受新任务
        threadPool.shutdown();

        try {
            // 等待所有任务完成，最多等待 1 分钟
            if (!threadPool.awaitTermination(1, TimeUnit.MINUTES)) {
                // 如果超时还没完成，强制关闭
                threadPool.shutdownNow();
            }
            System.out.println("所有数字打印完成！");
        } catch (InterruptedException e) {
            // 发生中断，强制关闭线程池
            threadPool.shutdownNow();
            Thread.currentThread().interrupt();
        }
    }
}

